package com.gxaedu.rbac.service.impl;

import com.gxaedu.rbac.pojo.Auth;
import com.gxaedu.rbac.pojo.Role;
import com.gxaedu.rbac.pojo.User;
import com.gxaedu.rbac.service.RbacService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:Teacher黄
 * @date:Created at 2020/04/22
 */
@Service
public class RbacServiceImpl implements RbacService {

    @Autowired
    private RedisTemplate<String,Object> jsonRedisTemplate;


    /**
     * 判断是否是否是 超级管理员
     * @param request
     * @return
     */
    @Override
    public Boolean redisIsSuper(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        // 应该先去redis中获取数据, 如果没有, 再从方法中去获取
        String superKey = "rbac:user:issuper:"+user.getUserId();
        Boolean superAdmin = (Boolean) jsonRedisTemplate.opsForValue().get(superKey);
        if(superAdmin == null){
            // 再从方法中去判断
            superAdmin = isSuper(user);
            // 方法中获取到之后, 再次存入redis
            jsonRedisTemplate.opsForValue().set(superKey,superAdmin);
        }
        return superAdmin;
    }

    /**
     * 获取权限列表
     * @param request
     * @return
     */
    @Override
    public List<Auth> redisAuthList(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        // 先从redis中获取数据
        String authKey = "rbac:auth:"+user.getUserId();
        List<Auth> auths = (List<Auth>) jsonRedisTemplate.opsForValue().get(authKey);
        if(auths == null){
            // 从方法中去获取
            auths = getAuthList(user);
            // 重新存入redis
            jsonRedisTemplate.opsForValue().set(authKey,auths);
        }
        return auths;
    }

    /**
     * 退出登陆清空缓存
     * @param request
     */
    @Override
    public void cleanCache(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        // 组装对应的key
        String superKey = "rbac:user:issuper:"+user.getUserId();
        String authKey = "rbac:auth:"+user.getUserId();
        jsonRedisTemplate.delete(superKey);
        jsonRedisTemplate.delete(authKey);
    }


    /**
     * 判断是否是超级管理员
     * @param user
     * @return
     */
    private Boolean isSuper(User user){
        List<Role> roles = user.getRoles();
        if (roles.size() == 0) {
            // 用户如果没有角色,那么就不是超级管理员
            return false;
        }
        // 遍历判断是否是超级管理员
        for (Role role : roles) {
            if (role.getIsSuper().equals(1L)) {
                return true;
            }
        }
        return false;
    }


    /**
     * 获取认证的权限列表
     * @param user
     * @return
     */
    private List<Auth> getAuthList(User user){
        // 准备一个装权限的list
        List<Auth> auths = new ArrayList<>();
        // 1. 先获取角色
        List<Role> roles = user.getRoles();
        if(roles.size() == 0){
            return null;
        }
        // 依次的去对应角色下面获取对应的权限
        for (Role role : roles) {
            auths.addAll(role.getAuths());
        }
        return auths;
    }
}
